批处理替换指定目录下所有文件夹名和文件名 | 您所在的位置:网站首页 › cmd 批量改文件名 › 批处理替换指定目录下所有文件夹名和文件名 |
近期遇到个问题,需要将电脑上某个目录下所有的文件夹名和文件名(包含子文件夹下的)的某个字符串统一替换,文件数量很多,有上千个甚至上万个,同样需要处理的电脑还有很多台,一个个改是不可能的,那得改到猴年马月去了,必须得开发个脚本自动处理。但由于电脑上没有任何开发环境,因为特殊原因也不允许安装任何开发软件,只能尝试Windows自带的Dos命令,也就是批处理。 需要自定义的参数有三个,分别是指定目录targetDir,原字符串originText,新字符串newText,按实际情况自行修改即可,例如下面的D:\work、strOld和strNew。 @echo off setlocal enabledelayedexpansion set targetDir=D:\work set originText=strOld set newText=strNew D: cd %targetDir% for /R %%s in (.,*) do ( echo %%s set originPath=%%~nxs set newPath=!!originPath:%originText%=%newText%! ren "%%s" "!newPath!" ) pause脚本使用注意事项: set语句里的=两边没有空格; 如果字符串里有中文的话,把文件编码改为ANSI格式,否则会有乱码。 脚本开发注意事项: 变量引用有%%和!!两种,按dos的解释,%%是取环境变量,!!是延迟环境变量的扩充,在if、for等嵌套语句里,如果对某一变量重复赋值时,用!!才能实时取到值,用%%取到的永远是最后一次赋值的值,同时在前面需要加个开关声明setlocal enabledelayedexpansion。 可能存在的问题及解决办法脚本可能存在一个问题:由于系统遍历的顺序是先遍历文件夹,然后再进入文件夹里遍历子文件夹和子文件,所以如果该文件夹名字被替换的话,会跳过子文件夹以及子文件的遍历,响应的替换操作也会跳过。 解决该问题有两种办法: 办法一:多执行几次脚本,最多执行次数是指定目录的文件树的层数,也就是子文件夹最多的层数。 办法二:把重命名的命令输出追加到文件,改为echo ren "%%s" "!newPath!">>run.bat,这样run.bat会有很多条重命名的语句,一个文件夹或文件对应一个,然后将所有的命令拷贝至Excel,进行倒序处理,第一条的放最后,最后一条的放前面等等,然后再将倒序后的所有命令拷贝回run.bat,最后双击运行即可。原理是手动让程序先遍历子文件夹和子文件,最后再遍历父文件夹。 总结Windows自带的批处理命令,能快速处理文件相关的操作,新建、删除、查询、重命名等。优点在于不依赖三方库,即写即运行,效率也还可以;缺点在于语法相对生硬,不易理解,书写困难,开放的接口有限,自由度不大。如果条件允许,建议使用Python等其他高级语言处理,开发效率更高。效果更好。 |
CopyRight 2018-2019 实验室设备网 版权所有 |